﻿using System.Collections;
using System.Collections.Generic;
using System.IO;
using UnityEngine;

public class CsvLoader : MonoBehaviour {

    // 用于保存我们生成地图的对象数组里
    // 0.地板
    // 1.内墙壁
    // 2.外墙壁
    // 3.敌人1
    // 4.敌人2
    // 5.出口
    // 6.食物1
    // 7.食物2
    // 内容特别多的时候不太推荐使用队列或者List 应该使用Map(C# 叫Dictionary 就是key去存储value方式)
    // 建议是key 对应Csv的中对应的内容名 value自然是游戏对象
    public GameObject[] map_Chip_entities;

    // 定义一个读取的路径
    // 一般是动态的 比如第一关 是stage +1 第二关 stage + 2 自增这个关卡的值就行了
    public const string filePath = "csv/test1";

    // 我们用string[]来区分csv文件的字符串行
    // 用List来区分csv的字符串列
    // 这里的List是保存的每一行
    // 这里的string[]是每一行中的每一个元素（格）
    // List可变长度（因为我们在导入的时候不知道有多少列）
    // 为了使用add函数能一直自增使用起来方便
    // string[]长度必须通过new 初始化指定 
    // 比如var col = new stirng[5]; 这个col里只能塞5个元素 索引0-4 不方便
    // 字符串有一个Split方法 返回的是stirng[]这样的类型 所以我们才对每一行保存的内容是string[]
    // 这也是为什么我这里没有用 List<List<String>>或者string[][]string[,]的方法\
    // 列元素 行元素
    //  ↓      ↓
    // List<string[]>
    public List<string[]> StageDate = new List<string[]> ();

    private void Start () {

        // File.ReadAllText("路径")；
        // 正常理解我们应该是用Io的读取文件方法去获取一个文件的全部内容文本....
        // 现在这个状态是可以的 但是打包后不行（会被编译 压缩 加密 通过相对路径来说得不到文件的）

        // 初始化 先用unity的Resouces函数读取我们的文件
        Load_Data (filePath);
        // 根据读取的Csv每一行每一列的元素加载我们的地图元素
        CreateMap ();
    }

    void CreateMap () {

        // 遍历列
        for (int i = 0; i < StageDate.Count; i++) {
            // 遍历行
            for (int j = 0; j < StageDate[i].Length; j++) {

                // 生成的对象不需要地板的话 这里给一个flag
                // 默认地图上应该是都能看的到地形 所以默认会给一个地板
                bool isNotFloor = true;
                int index = 9;

                string name = StageDate[i][j];

                switch (StageDate[i][j]) {
                    case "W":
                        // 假如 W 是我们的外墙壁
                        isNotFloor = false;
                        index = 2;
                        break;

                    case "1":
                        // 假如 9 是我们的内墙壁
                        index = 1;
                        break;

                    case "E":
                        // 假如 E 是我们的出口
                        index = 5;
                        break;

                    case "E1":
                        // 假如 E1 是我们的敌人1
                        index = 3;
                        break;

                    case "E2":
                        // 假如 3 是我们的敌人2
                        index = 4;
                        break;

                    case "F1":
                        // 假如 3 是我们的食物1
                        index = 5;
                        break;
                    case "F2":
                        // 假如 3 是我们的食物2
                        index = 6;
                        break;
                    default:
                        // 其他情况默认是地板
                        index = 0;

                        // 假如不想生成对象
                        // index = -1;
                        break;

                }

                // 验证一下Csv上对应格子的元素
                // Debug.Log ("x:" + j + ",y:" + i + ",create:" + name);
                // 假如不想生成某个对象的索引
                // if (index == -1) {
                //     // 跳过之后的处理
                //     continue;
                // }

                // 需要生成的对象
                Instantiate (map_Chip_entities[index], new Vector3 (j, i, 0), Quaternion.identity);

                // 如果大小正好不是一个单位的时候 大家记得要乘以这个地图块（MapChip）的在游戏场景中的大小
                // Instantiate (map_Chip_entities[index], new Vector3 (j * size, i * size, 0), Quaternion.identity);

                if (isNotFloor) {
                    // 生成一个我们所需要的地板
                    Instantiate (map_Chip_entities[0], new Vector3 (j, i, 0), Quaternion.identity);
                }
            }
        }

    }

    // 也可以写成
    // public string[][] StageDate;

    /// <summary>
    /// 读取csv文件
    /// </summary>
    /// <param name="path">文件名</param>
    public void Load_Data (string path) {
        // 读取之前先清理掉旧的
        StageDate.Clear ();
        try {

            // 读取文本的Unity API 

            // Resources.Load (path) 这里的path可以是开发时的路径
            // as TextAsset 用于强转类型
            // (这里我们知道这个路径是文本 所以用Unity的这个获取文本的API去获得内容)
            // 这里能转换很多种资源 图片 音乐 游戏对象等等等等....可以官网查查
            // 有一种可以通过网络下载获取的资源 叫AssetBundle
            TextAsset textAsset = Resources.Load (path) as TextAsset;

            // .test属性获取内容
            string stringText = textAsset.text;
            //分割每一列 '\n'是换行符
            char[] cut = { '\n' };
            //获取我们的列

            // Split 把字符串对象根据分割符切割成数组 
            // 例子  "1-2-3-4-5-6-7".Split('-');
            // 结果是 ["1","2","3","4","5","6","7"]
            string[] stringTextLines = stringText.Split (cut);
            for (int i = 0; i < stringTextLines.Length - 1; i++) {
                // Y轴对象就是 stringTextLines[i]
                //    Debug.Log(
                //        string.Format("第{0}行"+ stringTextLines[i],i.ToString()));
                // X轴对象就是 stringTextLines[i].Split (',')
                // = 类似这样的的数组["1","2","3","4","5","6","7"]
                // 把同一行最后一个换行符\r去掉（坑，好像不是excel或者不是中文操作系统就没有这个东西）
                stringTextLines[i] = stringTextLines[i].Replace ("\r", "");

                Debug.Log ("第" + i + "行:" + stringTextLines[i]);

                string[] line = stringTextLines[i].Split (',');

                StageDate.Add (line);
            }

            // 对纵轴进行一下逆序 因为Unity的y向上是增长的 于我们加载每一行文字列正好相反
            // Reverse对List的排序进行倒转 使与我们在excel中看到的一致
            StageDate.Reverse ();
        } catch {

        }

    }
}